package TraLaLa.Servidor.DAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;

import TraLaLa.Servidor.GestorCanciones.Cancion;
import TraLaLa.Servidor.GestorCanciones.CancionDTO;
import TraLaLa.Servidor.GestorUsuarios.Usuario;

public class CancionDAO implements IDAO{
	
	private String driver="com.mysql.jdbc.Driver"; 
	private Connection conexion;
	
	public CancionDAO() throws ClassNotFoundException, SQLException
	{
			Class.forName(driver);
			conexion = DriverManager.getConnection("jdbc:mysql://localhost/musica", "root","");
	}

	@Override
	public int delete(Object o) throws SQLException {
		if(o instanceof Cancion){
			Statement statement = null;
			statement =  conexion.createStatement();
			String sql="";
			Cancion c=(Cancion)o;
			sql= "DELETE FROM cancion WHERE cancionid='"+c.getCancionid()+"';";
			int check=statement.executeUpdate(sql);
			statement.close();
			return check;}
		else
			throw new IllegalArgumentException("El parametro recibido debe ser de la clase Cancion!");
		
	}

	@Override
	public ArrayList<Cancion> getAll() throws SQLException {
		ResultSet resulset=null;
		Statement statement = null;
		statement =  conexion.createStatement();
		String sql="";
		sql= "Select * FROM cancion;";
		//ejecucion de sentencia sql
		resulset=statement.executeQuery(sql);
		//arrayList en el que se cargaran los resultados
		ArrayList<Cancion> lista= new ArrayList<Cancion>();
		
		//se recorren todas las entradas del result set
		while(resulset.next()){
			//a partir del resultset que representa cada linea extraida de la BBDD
			//se crea un objeto usuario que se carga en el array.
			lista.add(convertCancion(resulset));
		}
		
		statement.close();
		return lista;
	}
	
	public ArrayList<CancionDTO> getAllDTO(Usuario usuario) throws SQLException {
		ResultSet resulset=null;
		Statement statement = null;
		statement =  conexion.createStatement();
		String sql="";
		sql= "Select cancionid, titulo, artista, precio FROM cancion WHERE cancionid NOT IN (SELECT cancionid FROM tiene WHERE nick='"+usuario.getNick()+"')";
		//ejecucion de sentencia sql
		resulset=statement.executeQuery(sql);
		//arrayList en el que se cargaran los resultados
		ArrayList<CancionDTO> lista= new ArrayList<CancionDTO>();
		
		//se recorren todas las entradas del result set
		while(resulset.next()){
			//a partir del resultset que representa cada linea extraida de la BBDD
			//se crea un objeto usuario que se carga en el array.
			lista.add(convertCancionDTO(resulset));
		}
		
		statement.close();
		return lista;
	}
	
	public ArrayList<CancionDTO> cancionesDeUsuario(Usuario usuario) throws SQLException{
		ResultSet resulset=null;
		Statement statement = null;
		statement =  conexion.createStatement();
		String sql="";
		sql= "Select cancionid, titulo, artista, precio FROM cancion WHERE cancionid IN (SELECT cancionid FROM tiene WHERE nick='"+usuario.getNick()+"');";
		//ejecucion de sentencia sql
		resulset=statement.executeQuery(sql);
		//arrayList en el que se cargaran los resultados
		ArrayList<CancionDTO> lista= new ArrayList<CancionDTO>();
		
		//se recorren todas las entradas del result set
		while(resulset.next()){
			//a partir del resultset que representa cada linea extraida de la BBDD
			//se crea un objeto usuario que se carga en el array.
			lista.add(convertCancionDTO(resulset));
		}
		
		statement.close();
		return lista;
	}

	@Override
	public int save(Object o) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int update(Object o) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void closeConnection() throws SQLException {
		conexion.close();
		
	}
	
	private Cancion convertCancion(ResultSet res) throws SQLException{
		
		Cancion cancion= new Cancion(res.getString("titulo"), res.getString("artista"), res.getString("cancion"));
		cancion.setCancionid(res.getInt("cancionid"));
		cancion.setDuracion(res.getDouble("duracion"));
		cancion.setFecha(new Date(res.getLong("fecha")));
		cancion.setPrecio(res.getInt("precio"));
		cancion.setLetra(res.getString("letra"));
		
		return cancion;
	}
	
	private CancionDTO convertCancionDTO(ResultSet res) throws SQLException{
		
		CancionDTO cancion= new CancionDTO(res.getInt("cancionid"),res.getString("titulo"), res.getString("artista"), res.getInt("precio"));
		
		return cancion;
	}

	public int addCancionAUsuario(Usuario usuario, CancionDTO cancion) throws SQLException {
		
			
			Statement statement = null;
			statement =  conexion.createStatement();
			String sql="";
			sql= "INSERT INTO tiene VALUES ('"+cancion.getCancionid()+"','"+usuario.getNick()+"');";
			int check=statement.executeUpdate(sql);
			
			statement.close();
			return check;
		
	}

}
